from flask_redis import FlaskRedis
from app.utils.logger_util import LoggerUtil


class RedisTool:
    _instance = None

    @classmethod
    def get_instance(cls, app=None):
        if cls._instance is None:
            cls._instance = cls(app)
            cls._instance.logger.info(f"RedisTool调度器初始化成功 实例ID:{id(cls._instance)}")
        return cls._instance

    def __init__(self, app):
        flask_redis = FlaskRedis()
        flask_redis.init_app(app)
        self.redis_client = flask_redis
        self.logger = LoggerUtil.get_logger()

    def set_value(self, key, value, ex=None):
        """
        向 Redis 中设置键值对，可设置过期时间（可选）
        :param key: 键
        :param value: 值
        :param ex: 过期时间（秒），默认为 None（不过期）
        """
        return self.redis_client.set(key, value, ex=ex)

    def get_value(self, key):
        """
        从 Redis 中获取对应键的值
        :param key: 键
        return: 值，如果不存在返回 None
        """
        return self.redis_client.get(key)

    def delete_key(self, key):
        """
        删除 Redis 中的指定键
        :param key: 键
        """
        return self.redis_client.delete(key)

    def reset_expiration(self, key, ex=900):  # 默认15分钟

        """

        重置键的过期时间

        :param key: Redis键

        :param ex: 过期时间(秒)，默认15分钟

        :return: True if successful, False if key does not exist

        """

        if self.redis_client.exists(key):
            return self.redis_client.expire(key, ex)

        return False
